package br.com.pfc.application.dao;

import br.com.pfc.model.Atendimento;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.TransactionPropagationType;
import org.jboss.seam.annotations.Transactional;

/**
 *
 * @author Vanda
 */
@AutoCreate
@Name("atendimentoDAO")
@Transactional(TransactionPropagationType.SUPPORTS)
public class AtendimentoDAO {

    @In
    private Session pfc;

    public List<Atendimento> obterTodos() {
        Criteria c = pfc.createCriteria(Atendimento.class);
        return c.list();
    }

    public void salvar(Atendimento atendimento) {
        pfc.save(atendimento);
        pfc.flush();
    }

    /**
     * Efetua FLUSH
     * @throws Exception
     */
    public void cancelar() throws Exception {

        try {
            pfc.clear();
            pfc.flush();
        } catch (HibernateException he) {
            throw new Exception(he);
        }
    }

    public List<Atendimento> pesquisarPorTipo(String tipoEquipamento) {
        Criteria c = pfc.createCriteria(Atendimento.class);
        c.add(Restrictions.eq("tipo", tipoEquipamento));
        return c.list();
    }

    public List<Atendimento> pesquisar() {
        Criteria c = pfc.createCriteria(Atendimento.class);
        return c.list();
    }

    public void alterar(Atendimento atendimento) {
        pfc.update(atendimento);
        pfc.flush();
    }

    public void excluir(Atendimento atendimento) {
        pfc.delete(atendimento);
        pfc.flush();
    }

    public Atendimento obterPorId(Integer idAtendimento) {
        Criteria c = pfc.createCriteria(Atendimento.class);
        c.add(Restrictions.eq("idAtendimento", idAtendimento));
        return (Atendimento) c.uniqueResult();
    }

    public List<Atendimento> pesquisaPorPeriodo(String paramDataInicial, String paramDataFinal) throws ParseException {
        List<Atendimento> retorno = pesquisar();
        SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
        Date paramDataIni =  formatador.parse(paramDataInicial);
        Date paramDataFin =  formatador.parse(paramDataFinal);

        for (Atendimento atendimento : retorno) {
            Calendar dataIni = Calendar.getInstance();
            dataIni.setTime(atendimento.getDataAbertura());
            Calendar dataFin = Calendar.getInstance();
            dataFin.setTime(atendimento.getDataFechamento());

            if(dataFin.after(paramDataFin) || dataIni.before(paramDataIni)){
                retorno.remove(atendimento);
            }
        }
        return null;
    }

    public List<Atendimento> pesquisaPorStatus(Integer paramStatus) {
        Criteria c = pfc.createCriteria(Atendimento.class);
        String param = null;
        if (paramStatus == 1) {
            param = "Aberto";
        } else {
            param = "Fechado";
        }
        c.add(Restrictions.eq("status", param));
        return c.list();
    }

    public List<Atendimento> pesquisaPorUsuario(String paramUsuarioAtendimento) {
        Criteria c = pfc.createCriteria(Atendimento.class);
        c.add(Restrictions.eq("usuarioAbertura.login", paramUsuarioAtendimento));
        return c.list();
    }

    public List<Atendimento> pesquisaPorLocal(String paramLocalAtendimento) {
        Criteria c = pfc.createCriteria(Atendimento.class);
        c.add(Restrictions.eq("equipamento.local.nome", paramLocalAtendimento));
        return c.list();
    }
}
